home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / network / ka9q / ka9q_src.arc / SMISC.C < prev    next >
C/C++ Source or Header  |  1988-11-30  |  4KB  |  194 lines

  1. /* Miscellaneous servers */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "netuser.h"
  6. #include "timer.h"
  7. #include "tcp.h"
  8. #include "remote.h"
  9.  
  10. static struct tcb *disc_tcb,*echo_tcb;
  11. static struct socket remsock;
  12.  
  13. /* Start up discard server */
  14. discard_start(argc,argv)
  15. int argc;
  16. char *argv[];
  17. {
  18.     struct socket lsocket;
  19.     void disc_recv(),misc_state();
  20.  
  21.     lsocket.address = ip_addr;
  22.     if(argc < 2)
  23.         lsocket.port = 9;
  24.     else
  25.         lsocket.port = atoi(argv[1]);
  26.     disc_tcb = open_tcp(&lsocket,NULLSOCK,TCP_SERVER,0,disc_recv,NULLVFP,misc_state,0,(char *)NULL);
  27. }
  28. /* Start echo server */
  29. echo_start(argc,argv)
  30. int argc;
  31. char *argv[];
  32. {
  33.     void echo_recv(),echo_trans(),misc_state();
  34.     struct socket lsocket;
  35.  
  36.     lsocket.address = ip_addr;
  37.     if(argc < 2)
  38.         lsocket.port = 7;
  39.     else
  40.         lsocket.port = atoi(argv[1]);
  41.     echo_tcb = open_tcp(&lsocket,NULLSOCK,TCP_SERVER,0,echo_recv,echo_trans,misc_state,0,(char *)NULL);
  42.  
  43. }
  44.  
  45. /* Start remote exit/reboot server */
  46. rem_start(argc,argv)
  47. int argc;
  48. char *argv[];
  49. {
  50.     void uremote();
  51.  
  52.     remsock.address = ip_addr;
  53.     if(argc < 2)
  54.         remsock.port = REMOTE_PORT;
  55.     else
  56.         remsock.port = atoi(argv[1]);
  57.     open_udp(&remsock,uremote);
  58. }
  59.  
  60. /* Shut down miscellaneous servers */
  61. discard_stop()
  62. {
  63.     if(disc_tcb != NULLTCB)
  64.         close_tcp(disc_tcb);
  65. }
  66. echo_stop()
  67. {
  68.     if(echo_tcb != NULLTCB)
  69.         close_tcp(echo_tcb);
  70. }
  71. rem_stop()
  72. {
  73.     del_udp(&remsock);
  74. }
  75. /* Discard server receiver upcall */
  76. static
  77. void
  78. disc_recv(tcb,cnt)
  79. struct tcb *tcb;
  80. int16 cnt;
  81. {
  82.     struct mbuf *bp;
  83.  
  84.     if(recv_tcp(tcb,&bp,cnt) > 0)
  85.         free_p(bp);            /* Discard */
  86. }
  87.  
  88. /* Echo server receive
  89.  * Copies only as much will fit on the transmit queue
  90.  */
  91. static
  92. void
  93. echo_recv(tcb,cnt)
  94. struct tcb *tcb;
  95. int cnt;
  96. {
  97.     struct mbuf *bp;
  98.     int acnt;
  99.  
  100.     if(cnt == 0){
  101.         close_tcp(tcb);
  102.         return;
  103.     }
  104.     acnt = min(cnt,tcb->snd.wnd);
  105.     if(acnt > 0){
  106.         /* Get only as much will fit in the send window */
  107.         recv_tcp(tcb,&bp,tcb->snd.wnd);
  108.         send_tcp(tcb,bp);
  109.     }
  110. }
  111. /* Echo server transmit
  112.  * Copies anything that might have been left in the receiver queue
  113.  */
  114. static
  115. void
  116. echo_trans(tcb,cnt)
  117. struct tcb *tcb;
  118. int16 cnt;
  119. {
  120.     struct mbuf *bp;
  121.  
  122.     if(tcb->rcvcnt > 0){
  123.         /* Get only as much will fit in the send window */
  124.         recv_tcp(tcb,&bp,cnt);
  125.         send_tcp(tcb,bp);
  126.     }
  127. }
  128.  
  129. /* Log connection state changes; also respond to remote closes */
  130. static
  131. void
  132. misc_state(tcb,old,new)
  133. register struct tcb *tcb;
  134. char old,new;
  135. {
  136.     switch(new){
  137.     case ESTABLISHED:
  138.         log(tcb,"open %d",tcb->conn.local.port);
  139.         break;
  140.     case CLOSE_WAIT:
  141.         close_tcp(tcb);
  142.         break;
  143.     case CLOSED:
  144.         log(tcb,"close %d",tcb->conn.local.port);
  145.         del_tcp(tcb);
  146.         /* Clean up if server is being shut down */
  147.         if(tcb == disc_tcb)
  148.             disc_tcb = NULLTCB;
  149.         else if(tcb == echo_tcb)
  150.             echo_tcb = NULLTCB;
  151.         break;
  152.     }
  153. }
  154. /* Process remote exit/reset command */
  155. void
  156. uremote(sock,cnt)
  157. struct socket *sock;
  158. int16 cnt;
  159. {
  160.     struct mbuf *bp;
  161.     struct socket fsock;
  162.     char command,*cp;
  163.     long t;
  164.     extern FILE *logfp;
  165.  
  166.     time(&t);
  167.     cp = ctime(&t);
  168.     rip(cp);
  169.  
  170.     recv_udp(sock,&fsock,&bp);
  171.     command = pullchar(&bp);
  172.     switch(command&0xff){
  173.     case SYS_RESET:
  174.         if(logfp != NULLFILE){
  175.             fprintf(logfp,"%s %s - REMOTE RESET\n",
  176.                 cp,psocket(&fsock));
  177.             fflush(logfp);
  178.             fclose(logfp);
  179.         }
  180.         sysreset();
  181.         break;    /* Not necessary */
  182.     case SYS_EXIT:
  183.         if(logfp != NULLFILE){
  184.             fprintf(logfp,"%s %s - REMOTE EXIT\n",
  185.                 cp,psocket(&fsock));
  186.             fflush(logfp);
  187.             fclose(logfp);
  188.         }
  189.         iostop();
  190.         exit(0);
  191.         break;
  192.     }
  193. }
  194.